<html>
 <head>
  <meta charset="UTF-8">
 </head>
 <body>
  <h1 data-lake-id="ga23O" id="ga23O"><span data-lake-id="u7529f47e" id="u7529f47e">典型回答</span></h1>
  <p data-lake-id="u5fce33da" id="u5fce33da"><br></p>
  <p data-lake-id="u6b9b576d" id="u6b9b576d"><span data-lake-id="ucd16624f" id="ucd16624f">Cookie、Session和Token是用于在Web应用程序中管理用户状态和身份验证的技术。因为在Web应用中，HTTP的通信是无状态的，每个请求都是完全独立的，所以服务端无法确认当前访问者的身份信息，无法分辨上一次的请求发送者和这一次的发送者是不是同一个人。</span></p>
  <p data-lake-id="ud5c4c5ab" id="ud5c4c5ab"><span data-lake-id="ue54658dc" id="ue54658dc">​</span><br></p>
  <p data-lake-id="u09cc0185" id="u09cc0185"><span data-lake-id="u920257f7" id="u920257f7">Cookie是由服务器发送给用户浏览器的小型文本文件，存储在客户端的浏览器中。它会在浏览器下次向同一服务器再发起请求时被携带并发送到服务器上。服务器可以读取Cookie并使用其中的信息来进行识别和个性化处理。</span></p>
  <p data-lake-id="u68cd1177" id="u68cd1177"><span data-lake-id="u47bf7ddc" id="u47bf7ddc">​</span><br></p>
  <p data-lake-id="uf306c8a3" id="uf306c8a3"><span data-lake-id="ud6752779" id="ud6752779">每个 cookie 都会绑定单一的域名，无法在别的域名下获取使用，一级域名和二级域名之间是允许共享使用的。</span><strong><span data-lake-id="u82cd18e0" id="u82cd18e0">cookie 是不可跨域的，并且每个域名下面的Cookie的数量也是有限的。</span></strong></p>
  <p data-lake-id="u54cbaaa8" id="u54cbaaa8"><span data-lake-id="uaf88d354" id="uaf88d354">​</span><br></p>
  <p data-lake-id="uc78a5976" id="uc78a5976"><span data-lake-id="u71da12a0" id="u71da12a0">Session是在服务器端创建和管理的一种会话机制。当用户首次访问网站时，服务器会为该用户创建一个唯一的Session ID，通常通过Cookie在客户端进行存储。会话标识符在后续的请求中用于标识具体是哪个用户。</span><strong><span data-lake-id="u2184c4d5" id="u2184c4d5">通常情况下，session 是基于 cookie 实现的，session 存储在服务器端，sessionId 会被存储到客户端的cookie 中。</span></strong></p>
  <p data-lake-id="uc67e7cfb" id="uc67e7cfb" style="text-align: justify"><span data-lake-id="u3230de36" id="u3230de36" class="lake-fontsize-12" style="color: rgb(85, 85, 85)">​</span><br></p>
  <p data-lake-id="u8b5a41f2" id="u8b5a41f2" style="text-align: justify"><img src="https://cdn.nlark.com/yuque/0/2023/png/5378072/1687330339680-8119359b-a515-4be9-9d03-41d41a51728a.png?x-oss-process=image%2Fwatermark%2Ctype_d3F5LW1pY3JvaGVp%2Csize_20%2Ctext_SmF2YSA4IEd1IFA%3D%2Ccolor_FFFFFF%2Cshadow_50%2Ct_80%2Cg_se%2Cx_10%2Cy_10"></p>
  <p data-lake-id="u211a9112" id="u211a9112"><br></p>
  <p data-lake-id="u6b5b8353" id="u6b5b8353"><span data-lake-id="ue1cce701" id="ue1cce701">Cookie 和 Session 的区别主要有以下几个</span></p>
  <ol list="u4a4743d1">
   <li fid="u0392448f" data-lake-id="u5f87a15e" id="u5f87a15e"><span data-lake-id="u51ffc13b" id="u51ffc13b">存储位置不同： Session 是存储在服务器端的，Cookie 是存储在客户端的。</span></li>
   <li fid="u0392448f" data-lake-id="u07b428c2" id="u07b428c2"><span data-lake-id="u3af83d25" id="u3af83d25">安全性不同：因为Session存储在服务器端，所以Session 比 Cookie 安全。</span></li>
   <li fid="u0392448f" data-lake-id="u48249de7" id="u48249de7"><span data-lake-id="u0f3686d3" id="u0f3686d3">存取值的类型不同：Cookie 只支持存字符串数据，想要设置其他类型的数据，需要将其转换成字符串，Session 可以存任意数据类型。</span></li>
   <li fid="u0392448f" data-lake-id="u5260d221" id="u5260d221"><span data-lake-id="uc292de31" id="uc292de31">有效期不同： Cookie 可设置为长时间保持，比如我们经常使用的默认登录功能，Session 一般失效时间较短，客户端关闭（默认情况下）或者 Session 超时都会失效。</span></li>
   <li fid="u0392448f" data-lake-id="u7a1d1557" id="u7a1d1557"><span data-lake-id="ufec898ad" id="ufec898ad">存储大小不同： 单个 Cookie 保存的数据不能超过 4K，Session 可存储数据远高于 Cookie，但是当访问量过多，会占用过多的服务器资源。</span></li>
  </ol>
  <p data-lake-id="uc93cf43b" id="uc93cf43b"><br></p>
  <p data-lake-id="u891a653e" id="u891a653e"><span data-lake-id="u5c426d78" id="u5c426d78">有了cookie和session之后，基本可以实现用户的各种验证、鉴权及身份识别了。但是，</span><strong><span data-lake-id="u2f5ab2dc" id="u2f5ab2dc">还是有一些场景中，不是特别适合这两种方案，或者说这两种方案的话还不够，那么就需要token上场了。</span></strong></p>
  <p data-lake-id="u84e1606d" id="u84e1606d"><span data-lake-id="u90b889de" id="u90b889de">​</span><br></p>
  <blockquote data-lake-id="u84588e13" id="u84588e13">
   <p data-lake-id="u4d524809" id="u4d524809"><span data-lake-id="u21d6fbf7" id="u21d6fbf7">Token也是一种用于用户身份鉴权的手段。他其实是一种代表用户身份验证和授权的令牌。在Web应用程序中，常用的身份验证方案是基于令牌的身份验证（Token-based Authentication）。当用户成功登录时，服务器会生成一个Token并将其返回给客户端。客户端在后续的请求中将Token包含在请求头或请求参数中发送给服务器。服务器接收到Token后，会进行验证和解析，以确定用户的身份和权限。Token通常是基于某种加密算法生成的，因此具有一定的安全性。</span></p>
  </blockquote>
  <p data-lake-id="uddf6e87f" id="uddf6e87f"><span data-lake-id="u8e224265" id="u8e224265">​</span><br></p>
  <p data-lake-id="u0d59e40c" id="u0d59e40c"><span data-lake-id="u427d1858" id="u427d1858">主要由以下几个场景：</span></p>
  <p data-lake-id="ue069e13a" id="ue069e13a"><span data-lake-id="u8ab98548" id="u8ab98548">​</span><br></p>
  <p data-lake-id="u23d78a4f" id="u23d78a4f"><span data-lake-id="u10e13473" id="u10e13473">1、</span><strong><span data-lake-id="u1d6ded12" id="u1d6ded12">跨域请求</span></strong><span data-lake-id="u0b02d005" id="u0b02d005">：Cookie是不支持跨域的，当在不同的域名之间进行通信时，使用Token可以更方便地在跨域请求中传递身份验证信息，而不受Cookie限制。</span></p>
  <p data-lake-id="ubbc79acc" id="ubbc79acc"><span data-lake-id="u2d8d787a" id="u2d8d787a">2、</span><strong><span data-lake-id="u167449f9" id="u167449f9">分布式场景</span></strong><span data-lake-id="u521eb9dd" id="u521eb9dd">：Session是存储在服务器上的，但是随着现在很多都是集群部署，这就使得Session也需要实现分布式Session，而如果能用Token的话，就可以不用这么复杂。</span></p>
  <p data-lake-id="uf588e574" id="uf588e574"><span data-lake-id="u72d750ed" id="u72d750ed">3、</span><strong><span data-lake-id="u268dace7" id="u268dace7">API交互</span></strong><span data-lake-id="u10abfc65" id="u10abfc65">：当我们使用浏览器访问后端服务的时候，可以用cookie和session，但是如果是API调用，比如Dubbo交互，就没办法做cookie的存储和传递了，而使用Token是常见的身份验证方式。客户端通过提供Token来证明其身份，并获得对受保护资源的访问权限。</span></p>
  <p data-lake-id="u192295fd" id="u192295fd"><span data-lake-id="u240c0123" id="u240c0123">4、</span><strong><span data-lake-id="u67046606" id="u67046606">跨平台应用程序</span></strong><span data-lake-id="u92c04a73" id="u92c04a73">：Token可以轻松地在不同的平台和设备之间共享和传递，而无需依赖特定的会话机制或Cookie支持。</span></p>
  <p data-lake-id="u2b486d16" id="u2b486d16"><span data-lake-id="u870e6932" id="u870e6932">5、</span><strong><span data-lake-id="u3b6b8301" id="u3b6b8301">前后端分离项目</span></strong><span data-lake-id="u4691a30a" id="u4691a30a">：现在很多项目都是前后端分离的了，这种项目中，前端和后端之间通过API的方式交互，这种的话用Token也会更加方便一些。</span></p>
  <p data-lake-id="u701e11e7" id="u701e11e7"><span data-lake-id="uafbf5b71" id="uafbf5b71">​</span><br></p>
  <p data-lake-id="ufdd9bddc" id="ufdd9bddc"><span data-lake-id="u40dcc72a" id="u40dcc72a">总之，因为Cookie和Session存在各种限制，所以Token也是目前常见的身份验证和状态管理方式，它具有更大的灵活性和适用性，特别适用于现代的应用程序架构和需求。它提供了一种无状态、可扩展和安全的身份验证和授权机制。</span></p>
  <p data-lake-id="u0e675f94" id="u0e675f94"><span data-lake-id="ua9ce46c2" id="ua9ce46c2">​</span><br></p>
  <p data-lake-id="u0e25c9b4" id="u0e25c9b4"><span data-lake-id="u7f4af218" id="u7f4af218">而且，有了token之后，还可以基于Token做防重检测。</span></p>
  <p data-lake-id="u33932b06" id="u33932b06"><span data-lake-id="uf0c9b607" id="uf0c9b607">​</span><br></p>
  <h1 data-lake-id="HXSh6" id="HXSh6"><span data-lake-id="u1fdfae3c" id="u1fdfae3c">扩展知识</span></h1>
  <p data-lake-id="uea6f7e46" id="uea6f7e46"><br></p>
  <h2 data-lake-id="b1Ee2" id="b1Ee2"><span data-lake-id="u6a4912fb" id="u6a4912fb">不用Cookie如何实现Session</span></h2>
  <p data-lake-id="ud451b55b" id="ud451b55b"><span data-lake-id="ua3551eb0" id="ua3551eb0">​</span><br></p>
  <p data-lake-id="u0d36ca29" id="u0d36ca29"><span data-lake-id="ud0e0e539" id="ud0e0e539">Cookie是实现Session的主要手段，但是有些场景中是不能使用的，比如有的浏览器可以禁用cookie，或者某些网站的cookie数量也有限制，而且跨域场景也不能用cookie 。所以，如果不能用cookie，那么改如何实现session呢？</span></p>
  <p data-lake-id="u6fd52497" id="u6fd52497"><span data-lake-id="u61eb5472" id="u61eb5472">​</span><br></p>
  <p data-lake-id="u3e4249bd" id="u3e4249bd"><span data-lake-id="u7c008481" id="u7c008481">首先就是可以将Session ID作为查询参数附加在URL中。例如，http://www.hollischuang.com/page?sessionid=hollis666。服务器会解析URL中的Session ID，并使用它来识别和恢复用户的会话状态。这种方式在某些情况下可以工作，但也存在一些安全性和隐私方面的考虑。</span></p>
  <p data-lake-id="ub414b9e9" id="ub414b9e9"><span data-lake-id="u90167998" id="u90167998">​</span><br></p>
  <p data-lake-id="u55a46887" id="u55a46887"><span data-lake-id="u93e22b2f" id="u93e22b2f">其次，也可以在页面的在表单中添加一个隐藏字段来存储Session ID。当用户提交表单时，会话标识符会随着请求一起发送到服务器。服务器接收到请求后，从隐藏字段中提取Session ID，并使用它来识别和恢复会话状态。这种方法通常用于Web应用程序中的表单提交和POST请求。</span></p>
  <p data-lake-id="u9ebf28f7" id="u9ebf28f7"><br></p>
  <p data-lake-id="u8284c39a" id="u8284c39a"><br></p>
 </body>
</html>